Hyrje

Funksionet ne PHP jane e njejta ide ashtu si metodat apo funksionet ne gjuhe te tjera programimi. Nje funksion eshte nje pjese kodi i cili mund te marre disa parametra ne hyrje (input), dhe pasi ben nje procesim te brendshem, mund te ktheje nje vlere (output). Ne seksionet e kaluara kemi pare funksione te tilla si print("Pershendetje!") ose echo("Pershendetje!") te cilat jane funksione te brendshme te PHP-se dhe vijne sebashku me te ne menyre qe te na lehtesojne pune neve gjate programimit. Ashtu si ato, ne mund te krijojme funksionet tona te pershtatura sipas nevojes.

Duhet te kemi parasysh dy koncepte te qarta:

  1. Krijimi i nje funksioni
  2. Therritja e nje funksioni

Ne shume raste ne nuk do te kemi nevoje te krijojme funksionet tona personale, pasi PHP-ja vjen me mijera funksione te gatshme te cilat mund ti perdorim per veprime te ndryshme si procesim stringash, numrash, koleksionesh array etj. Ne rastin e funksioneve te gatshme te PHP-se, na mjafton thjesht therritja e funksioneve, pasi ata jane krijuar nga krijuesit e gjuhes se PHP-se dhe ne thjesht duhet ti perdorim.

Krijimi dhe therritja e funksioneve

Te krijosh nje funksion nuk eshte aspak e veshtire. Supozojme qe duam te krijojme nje funksion i cili thjesht do te shkruaje nje mesazh ne brouser kur ne ta therrasim (perdorim) ate.

Kur krijojme nje funksion duhet te nisim me perdorimin e termit function dhe me pas shkruajm emrine funksionit p.sh. shfaqMesazh dhe me pas i gjithe kodi PHP duhet te futet ndermjet kllapave { dhe }, si ne shembullin e meposhtem:

<?php

//Deklarimi i nje funksioni ne PHP

function shfaqMesazh() {
  echo "Pershendetje, Shqiperi!";
}

//Therritja e nje funksioni ne PHP

shfaqMesazh();

Pasi kemi krijuar (deklaruar) funksionin me emrin shfaqMesazh, ne mund ta therrasim ate me emrin e tij shoqeruar me kllapat rrumbullake ( dhe ). Do te shohim me poshte qe brenda ketyre kllapave mund te kalohen dhe parametra te ndryshem. Pra, funksioni u therrit shfaqMesazh();.

Ne momentin qe therritet nje funksion i caktuar, nuk ndodh gje tjeter vecse ekzekutohet kodi i funksionit ne fjale, i cili ndodhet brenda kllapave gjarperuese { dhe } (qe ndodhet atje ku funksioni eshte krijuar).

Pas therritjes se funksionit te mesiperm, do te ekzekutohet blloku i funksionit, pra ne kete rast rreshti:

<?php

echo "Pershendetje, Shqiperi!";

Rezultati ne dalje do te jete: Pershendetje, Shqiperi!

Ne kete rast funksioni jone permban vetem nje rresht, por funksionet mund te permbajne nje numer te madh rreshtash, megjithese duhet te perpiqemi qe funksionet te jene te qarta dhe te pastra duke mos e bere kodin e rremujshem. Eshte mire qe funksionet te perdoren sa me shume ne menyre qe nje liste e madhe veprimesh te ndahen ne pjese te vogla, duke i ndare ne funksione specifike, por pa e tepruar.

Funksionet me parametra

Kemi mundesi qe funksioneve ne PHP t'u kalojme edhe parametra te cilat mund te perdoren ne bllokun e funksionit si variabla. Ne blloqet e zakonshme te kodit kemi pare qe para se te perdorim nje variabel eshte mire qe te jete inicializuar me nje vlere te caktuar (perndryshe do te kete vlere null). Ne bllokun e funksionit, te gjitha parametrat qe kalohen ne funksion mund te perdoren si variable. Inicializimi i ketyre variablave behet ne momentin e therritjes se funksionit, pasi ne kete moment per cdo parameter te funksionit duhet te kalojme nje vlere.

Le te marrim nje shembull, duke ndertuar nje funksion i cili ka dy parametra ne hyrje. Keto parametra jane te tipit integer. Ajo cfare do te beje funksioni eshte llogaritja e shumes se ketyre dy numrave dhe printimi ne brouser.

<?php

function mbledhNumrat($num1, $num2) {
  $shuma = $num1 + $num2;
  echo "Shuma e dy numrave eshte : $shuma";
}

//Therritja
mbledhNumrat(5, 10);

Pasi kemi deklaruar funksionin me emrin mbledhNumrat, brenda kllapave te funksionit ( dhe ) jane percaktuar dy parametra hyrje me emra specifik $num1 dhe $num2. Keto nuk jane asgje tjeter vecse deklarim variablash ne PHP, te cilat mund te perdoren brenda bllokut te funksionit.

Me pas eshte ruajtur shume $shuma = $num1 + $num2; e ketyre dy variablave ne nje variabel tjeter te quajtur $shuma. Me pas therritet funksioni echo per te printuar ne brouser echo "Shuma e dy numrave eshte : $shuma";.

Te keni kujdes, pasi deri ketu nuk ndodh asgje pasi eshte thjesht nje deklarim funksioni. Qe nje funksion i caktuar te ekzekutohet ai duhet therritur, ne kete rast mbledhNumrat(5, 10);.

Pasi kemi therritur funksionin me emrin specifik, brenda kllpapave kemi kaluar edhe dy numra. Keto dy numra jane vlerat qe do te marrin parametrat respektiv $num1 dhe $num2 (te quajtura ndryshe argumente). Pra, ne kete moment ndodh dhe inicializimi i parametrave, dhe pasi behet inicializimi i parametrave $num1` dhe `$num2, fillon ekzekutimi i bllokut te kodit te funksionit, ku gjendet shuma dhe printohet ne ekran.

Rezultati ne dalje do te jete: Shuma e dy numrave eshte : 15

Kalimi i argumenteve me reference

Ne rastin e mesiperm kemi treguar nje shembull ku kemi kaluar argumente me vlera direkte 5 dhe 10, por argumentet mund te jene edhe variabla me vlere te caktuar si shembulli i meposhtem:

<?php

$numri_1 = 7;
$numri_2 = 12;

mbledhNumrat($numri_1, $numri_2);

Ne kete rast shohim qe ne therritjen e funksionit kemi kaluar si argumente brenda kllapave disa variabla $numri_1, $numri_2. Keto variabla kane nje vlere te caktuar, dhe eshte e njejta gje si kalimi me vlere direkte si kalimi ne kete lloj forme. Ne kete moment, pas deklarimit te variablave $numri_1 dhe $numri_2, behet nje kopje e tyre, dhe kalohen si argumente tek funksioni. Pra, variablat qe kalohen tek funksioni kane vendndodhje te ndryshme ne memorie (referenca te ndryshme) nga variablat qe u deklaruan me lart. Kete gje ben PHP-ja. Ne momentin qe disa variabla te caktuara i kalojme si argumenta ne nje funksion, kalon thjesht nje kopje e tyre. Le te marrim nje shembull, nje funksion i cili i jep vlere variablit qe merr si input:

<?php

function ndryshoVleren($var_hyres) {

  //I japim vleren 10 variablit hyres
  $var_hyres = 10;

}

//Therrasim funksionin e mesiperm

$var_input = 27;

ndryshoVleren($var_input);

echo $var_input;

Rezultati ne dalje do te jete: 27.

Ne rastin e mesiperm, shohim qe funksioni i jep nje vlere 10 variablit qe merr ne hyrje. Ne momentin qe therrasim funksionin ndryshoVleren, ne i kalojme si argument variablin $var_input qe fillimisht ka vleren 27. Pasi ky variabel kalon ne hyrje te funksionit, do te filloje ekzekutimi i bllokut te funksionit ku variabli hyres merr vleren 10. Por variabli hyres ishte $var_input. Lind pyetja, a do ti ndryshohet vlera ketij variabli? Jo, pasi ne te vertete, argumenti i kaluar ne momentin e therritjes se funksionit ka nje reference tjeter nga $var_input. Funksionit ne momentin e therritjes i kalohet nje kopjes e tij, ndaj rreshti i fundit echo $var_input; do te printoje vleren 27 qe tregon qe vlera e $var_input nuk eshte ndryshuar.

Ne shume raste nuk duam qe ti kalojme argumentet si kopje, por si reference (pra te kalojme variablin origjinal). Kur ne i kalojme argumentet me reference, atehere cdo lloj ndryshimi qe mund te behet mbi ate variabel brenda bllokut te funksionit do te pasqyrohet edhe ne variablen jasht funksionit. Le te shohim nje shembull sesi kalohen argumentet me reference:

<?php

function ndryshoVleren(&$var_hyres) {

  //I japim vleren 10 variablit hyres
  $var_hyres = 10;

}

//Therrasim funksionin e mesiperm

$var_input = 27;

ndryshoVleren($var_input);

echo $var_input;

Ndryshimi i vetem nga rasti i mesiperm eshte se per te kaluar nje argument me reference, ne momentin e deklarimit te parametrave te funksionit duhet te vendosim simbolin & perpara variablave. Keshtu argumentet nuk do te kalojne si forme kopje por si variabli origjinal.

Duke qene se si argument i funksionit kemi kaluar origjinalin $var_input, ne momentin e ekzekutimit te funksionit ai merr vleren 10. Pasi kemi therritur funksionin kur ne e perdorim perseri variablin $var_input, ai nuk do te kete me vleren 27, pasi do te jete ndryshuar nga funksioni dhe vlera e tij e tanishme do te jete 10. Rezultati ne dalje do te jete: 10.

Funksionet qe kthejne vlere

Nje funksion i caktuar mund te ktheje nje vlere te caktuar duke perdorur deklaraten return te shoqeruar me nje vlere. return e ndalon ekzekutimin e bllokut te funksionit menjehere dhe kthen vleren ne pozicionin ku eshte therritur metoda. Nga nje funksion mund te kthejme edhe koleksion array.

Le te marrim si shembull nje funksion qe merr si parametra 2 numra, dhe kthen shumen e tyre:

<?php

function mbledhNumrat($num1, $num2) {
  $shuma = $num1 + $num2;
  return $shuma;
}

//Therritja
$vlera_e_kthyer = mbledhNumrat(5, 10);

Ne funksionin mbledhNumrat nuk kemi printuar gje ne brouser, por ne kete rast kemi kthyer vlere, kemi kthyer vleren e variablit $shuma duke perdorur return. Ajo cfare ndodh eshte thjesht kthimi i vleres ne pozicionin ku therritet funksioni. Ne kete rast ne nje variabel tjeter te quajtur $vlera_e_kthyer ruajme vleren qe kthehet nga therritja e funksionit me ane te operatorit vleredhenes =. Variabli $vlera_e_kthyer ne kete rast do te kete vleren 15 pasi ajo eshte shuma e kthyer nga therritja e funksionit mbledhNumrat me argumente 5 dhe 10.

Vlerat default (te parazgjedhura) per parametrat e funksionit

Nje funksion i caktuar mund te kete zero, nje ose me shume parametra. Ne shume raste nje funksion mund te kete disa parametra, por ne momentin qe e therrasim ne nuk duam qe t'ja kalojme te gjitha parametrat, por vetem nje pjese te tyre. Ne momentin qe nje funksioni nuk ja kalojme te gjitha argumentet e nevojshme ne momentin e therritjes, do te shfaqet nje mesazh ku na paralajmeron qe parametrat nuk jane vendosur si duhet.

Shembull:

<?php

function printoNumrat($num1, $num2, $num3) {
  echo $num1 . '<br/>';
  echo $num2 . '<br/>';
  echo $num3 . '<br/>';
}

printoNumrat(10, 20);

Ne shembullin e mesiperm funksioni pret tre parametra, nderkohe qe ne i kalojme vetem dy argumente kur e therrasim. Ne kete rast ne brouser do te printohet rezultati i meposhtem:

Warning: Missing argument 3 for printoNumrat(), called in \home\alban.afmeti\Desktop\index.php 
on line 9 and defined in \home\alban.afmeti\Desktop\index.php on line 3
10
20

Per te evituar keto probleme, perdorim konceptin e vlerave default (te parazgjedhura) per te gjitha ose nje pjese te variablave.

Shembull:

<?php

function printoNumrat($num1, $num2, $num3 = null) {
  echo $num1 . '<br/>';
  echo $num2 . '<br/>';
  echo $num3 . '<br/>';
}

printoNumrat(10, 20);

Ne kete rast parametrit te trete i kemi dhene nje vlere default null, qe eshte nje vlere boshe. Ne brouser do te printohet rezultati i meposhtem:

10
20

Pra, tashme ne mund te kalojme dy ose tre argumente per funksionin e mesiperm sepse parametri i trete eshte opsional. Vlera default mund t'u jepen te gjitha parametrave te funksionit, dhe kjo na jep mundesine qe nje funksion te mund ta therrasim me zero ose me shume parametra, ne varesi te numrit te parametrave qe ka.

Nje shembull tjeter ku si vlere default i japim nje numer, paraqitet me poshte:

<?php

function printoNumrat($num1, $num2, $num3 = 30) {
  echo $num1 . '<br/>';
  echo $num2 . '<br/>';
  echo $num3 . '<br/>';
}

printoNumrat(10, 20);

Ne kete rast rezultati do te jete:

10
20
30

Veme re qe printohet edhe vlera e fundit 30 edhe pse nuk ja kemi kaluar ne therritje. Kjo behet sepse ja kemi dhene si vlere default.

Therritjet dinamike te funksioneve

Eshte e mundur qe ne nje variable te ruhet ne forme stringe nje emer funksioni, dhe nepermjet kesaj variable te therritet funksioni qe e ka emrin si vlera e variables. Per qartesi shohim shembullin ne vijim:

<?php

function pershendetje() {
  echo "Pershendetje, Shqiperi!";
}

$function_name = "pershendetje";

//Therritja dinamike
$function_name();

Ne kete rast eshte variabli $function_name mban vleren pershendetje. Duke i bahskangjitur variablit edhe kllapat rrethore ( dhe ), ajo cfare ndodh kur therrasim dinamikisht $function_name(); eshte:

  1. Vlereseohet vlera e $function_name, e cila eshte pershendetje
  2. Therritet funksioni me vleren e variablit shoqeruar me kllapat pershendetje(); ashtu si ne rastet normale.

Dhe ne kete rast rezultati i therritjes eshte: Pershendetje, Shqiperi!

results matching ""

    No results matching ""